import * as async_hooks  from 'async_hooks';

/** 当前执行上下文id */
const eid = async_hooks.executionAsyncId();

/** 触发回调的id */
const tid = async_hooks.triggerAsyncId();

/** 创建异步钩子实例，回调是可选的，回调名称是确定的 */
const asyncHook = async_hooks.createHook({ init, before, after, destroy, promiseResolve });

/** 允许调用回调，默认是不允许的，必须显式调用 */
asyncHook.enable();

/** 禁止监听异步事件 */
//asyncHook.disable();


/**
 * 在资源构造期间调用，当这个回调运行时资源可能未完成构造
 * 因此所有的被asyncId引用资源的字段不一定被填充
 */
function init(asyncId, type, triggerAsyncId, resource) { 
    console.log("初始化钩子运行！");
    console.log("异步Id："+asyncId);
    console.log("类型为："+type);
    console.log("触发异步Id："+triggerAsyncId);
    console.log("资源为：");
    console.log(resource);
}

/**
 * 资源的回调调用之前，调用
 * @param asyncId ：异步id
 */
function before(asyncId) {
    console.log("Before钩子运行！");
    console.log("异步Id："+asyncId);
 }

/**
 * 资源回调完成之后调用
 * @param asyncId ：异步Id
 */
 function after(asyncId) {
     console.log("After钩子运行！");
     console.log("异步Id："+asyncId);
  }

/**
 * 异步资源实例销毁时调用
 * @param asyncId ：异步Id
 */
function destroy(asyncId) {
    console.log("Destory钩子运行！");
    console.log("异步Id：0"+asyncId);
 }

/** 只有Promise资源才会调用 */
function promiseResolve(asyncId) { }

/** 不知道为啥，这个构造方法调用了很多次init方法 */
console.log(new Date());
const resource:async_hooks.AsyncResource = new async_hooks.AsyncResource("test",tid);

setTimeout(()=>{
    console.log(new Date());
    //resource.emitBefore();
},1000)

setTimeout(()=>{
    console.log(new Date());
    //resource.emitAfter();
},2000)

setTimeout(()=>{
    console.log(new Date());
    //resource.emitDestroy();
},5000)